昨天講到要如何建立model,今天來講要如何訓練以及預測
建立完模型之後,必須呼叫compile()方法來指定損失函式與優化法(optimizer)
model.compile(loss="sparse_categorical_crossentropy",
optimizer="sgd",
metrics=["accuracy"])
這段程式需要解釋一下。首先,我們使用"sparse_categorical_crossentropy" loss的原因是因為標籤是類別,也就是每一個標籤彼此並不相關。如果是另一個情況,每一個實例都有每個類別的目標機率(例如one-hot向量,比如說[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.]代表3),我們就改用"categorical_crossentropy" loss。如果是在做二元分類,輸出層就要使用sigmoid激活函數,而不是"softmax"激活函數,並且要使用"binary_crossentropy" loss
將optimizer設為sgd代表我們要使用簡單的隨機梯度下降來訓練模型。換句話說,Keras會執行反向傳播法。
最後因為這個是分類器,因此使用 精確度(accuracy) 來評估可以很明顯的看出結果。
這邊我們只需要呼叫模型的fit()方法可以訓練它了:
history = model.fit(X_train, y_train, epochs=30,
validation_data=(X_valid, y_valid))
將輸入(X_train)以及目標類別(y_train)傳給它,以及訓練的epoch數,並且傳入驗證組
keras會在epoch結束的時候,使用驗證組來評估損失與其它的指標,可以讓你了解模型訓練的狀況
fit()方法會回傳一個History物件,裡面有訓練參數(history.params)、它經歷的epoch串列(history.epoch),以及一個字典(history.history),裡面有處理訓練組與驗證組的每個epoch完畢時的損失以及其他指標。利用這個字典來建立一個pandas DataFrame並且呼叫plot()方法
import pandas as pd
import matplotlib.pyplot as plt
pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1)
plt.show()
接著我們可以使用模型的predict()方法來對test資料做預測
這邊使用測試資料的前三個資料
X_new = X_test[:3]
y_proba = model.predict(X_new)
y_proba.round(2)
這邊可以看到模型計算出來各個類別的機率,從類別0到類別9。
y_pred = np.argmax(y_proba, axis=1)
y_new = y_test[:3]
print(y_pred)
print(y_new)
從這邊可以看到訓練出來的結果和正確答案一樣